package com.platform.core.service;

import com.querydsl.core.types.Predicate;
import com.platform.core.entity.SysFunction;
import com.platform.dto.FunctionQo;
import com.platform.dto.FunctionTreeNode;
import com.platform.dto.MenuTree;
import com.platform.enums.FunctionStatus;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.util.MultiValueMap;

import java.util.List;
import java.util.Map;


/**
 * Description: 系统菜单管理-Service接口
 *
 * @author wxw
 **/
public interface SysFunctionService extends BaseEntityBiz<SysFunction> {

    String ROOT = "pre_ncloud_sys_function_10000";
    String LOWROOT = "pre_ncloud_sys_function_10001";
    String LOWSUBROOT = "pre_ncloud_sys_function_20000";

    /**
     * 分页查询
     *
     * @param predicate  查询条件
     * @param pageable   分页参数
     * @param parameters 查询参数
     * @return 列表
     */
    Page<FunctionQo> queryFunctions(Predicate predicate, Pageable pageable, MultiValueMap<String, String> parameters);


    /**
     * 查询给定菜单id下的所有一级子菜单 新增菜单时调用刷新左边菜单树节点
     *
     * @param id 菜单ID
     * @return 菜单列表
     */
    List<FunctionQo> queryAllChildren(String id);

    /**
     * 根据菜单id删除菜单，如果有子菜单则会抛异常
     *
     * @param id 菜单ID
     * @return 是否删除成功
     */
    boolean delete(String id);

    /**
     * 添加菜单
     *
     * @param functionQo 菜单实体
     * @return 返回新增后的ID
     */
    FunctionQo create(FunctionQo functionQo);

    /**
     * 修改菜单
     *
     * @param functionQo 需要修改的实体
     * @return 返回修改后的菜单实体
     */
    FunctionQo modify(FunctionQo functionQo);

    /**
     * 取完整菜单树(不包含动作菜单)
     *
     * @return 权限目录菜单树
     */
    FunctionTreeNode loadAllFunction();

    /**
     * 根据appCode来获取应用对应的菜单树
     *
     * @param appCode 应用编码
     * @return 菜单树
     */
    FunctionTreeNode loadAllFunctionByApp(String appCode);

    /**
     * 根据appCode预览应用菜单树
     * @param appCode 应用编码
     */
    FunctionTreeNode previewByApp(String appCode);


    /**
     * 查询详情
     *
     * @param id 唯一标识
     * @return 菜单详情
     */
    FunctionQo queryWithPermissions(String id);


    /**
     * 取完整菜单树(包含动作菜单)
     *
     * @param roleId 角色ID
     * @return 权限目录菜单树
     */
    FunctionTreeNode treeAll(String roleId);

    /**
     * 检查同一父级菜单下菜单名称唯一
     *
     * @param id       ID (修改时用)
     * @param menuName 措施名称
     * @param parentId 父级菜单ID
     * @return boolean
     */
    boolean checkMenuNameIsExist(String id, String menuName, String parentId);

    /**
     * 获取权限菜单树
     *
     * @return {}
     */
    List<MenuTree> treeByAuthorizes(Map<String, Boolean> param);

    /**
     *  低代码平台-权限菜单树
     * @param param
     * @return
     */
    List<MenuTree> treeByAuthorizesLowcode(Map<String, String> param);

    /**
     * 启用禁用菜单
     *
     * @param ids            菜单ids
     * @param functionStatus 修改的状态
     */
    void changeFlag(List<String> ids, FunctionStatus functionStatus);

    /**
     * 查询菜单
     *
     * @param param 查询参数
     * @return 数量
     */
    long searchCount(Map<String, String> param);


    /**
     * 根据subSystemCode查找菜单
     *
     * @param subSystemCode 子系统代码
     * @return 菜单信息
     */
    FunctionQo queryBySubSystemCode(String subSystemCode);


    /**
     * 根据subSystemId查找菜单
     *
     * @param subSystemId 子系统id
     * @return 菜单信息
     */
    FunctionQo queryBySubSystemId(String subSystemId);

    /**
     * 根据bizType、path查询是否被有效菜单使用
     *
     * @param parametersMap 查询参数
     * @return 是否使用
     */
    boolean isUsedByFuncPath(Map<String, String> parametersMap);

    /**
     * 根据路由删除相关的所有菜单
     *
     * @param functionQo 查询参数
     */
    void removeByRoute(FunctionQo functionQo);

    /**
     * 根据条件查询菜单信息集合，返回list
     *
     * @param parametersMap
     * @return 菜单树
     */
    List<FunctionQo> searchFunctionByCodeAndBizType(Map<String, String> parametersMap);

    /**
     * 初始化菜单路径串RouteCode
     * @return
     */
    void initRouteCode();
}
